package com.ht.api.call.func.impl.task;

import com.ht.api.bean.AjaxResult;
import com.ht.api.bean.LoginBean;
import com.ht.api.call.func.IFunctionCall;
import com.ht.api.db.Db;
import com.ht.api.db.Entity;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.task.HtTaskExecutor;
import com.ht.api.db.task.TaskGroup;
import com.ht.api.db.task.TaskInfo;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 业务接口：启动定时任务
 * @author asq
 * @createTime 2025年2月8日 21:14:29
 */
@Slf4j
public class TaskStartFunctionCall implements IFunctionCall {

	@Override
	public String getName() {
		return "启动定时任务";
	}

	@Override
	public JSONObject execute(LoginBean me, JSONObject param, AjaxResult result) {
		// 获取任务
		Long taskId = param.getLong("taskId");
		if (taskId == null) {
			throw new HtException("请指定任务ID参数：taskId");
		}
		Entity task = Db.createSqlParser("db_task").findById(taskId);
		if (task == null) {
			throw new HtException("任务不存在，ID：" + taskId);
		}
		if (TaskInfo.RUNNING.equals(task.getStr("status"))) {
			throw new HtException("任务执行中，勿须重复启动~");
		}
		
		// 根据数据库配置还原任务对象
		TaskInfo taskInfo = TaskInfo.load(task);
		
		// 加载任务组
		if (taskInfo.getGroupId() != null && !HtTaskExecutor.groups.containsKey(taskInfo.getGroupId())) {
			Entity entity = Db.findOne("select * from db_task_group where group_id=?", taskInfo.getGroupId());
			TaskGroup taskGroup = TaskGroup.load(entity);
			HtTaskExecutor.groups.put(taskInfo.getGroupId(), taskGroup);
		}
		
		// 开始任务
		HtTaskExecutor.startTask(taskInfo);
		log.info("[TaskRestartFunctionCall]重启定时任务,taskId:{}, json:{}", taskInfo.getTaskId(), task.toString());
		
		return JSONUtil.createObj();
	}

}
